/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.pb.sistcomp.dao;

import br.pb.sistcomp.entity.Pessoa;
import br.pb.sistcomp.exception.ErroObjetoNull;
import br.pb.sistcomp.util.HibernateUtil;
import br.pb.sistcomp.util.MessagesUtil;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;

/**
 * Class that represents an entity in the system
 *
 * @author Diego S., diego@diegosousa.com
 * @version 1.0
 *
 * Copyright (C) 2011 SistComp.
 */
public class PessoaDaoImpl implements PessoaDao {

    private EntityManager em;

    /**
     * 
     *This constructor creates the instance of EntityManager
     * 
     */
    public PessoaDaoImpl() {
        em = HibernateUtil.getInstance().getFactory().createEntityManager();
    }
    /*
    method to save a person
     */

    @Override
    public void salvar(Pessoa pessoa) {

        try {

            em.getTransaction().begin();
            em.persist(pessoa);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.getMessage();
            em.getTransaction().rollback();

        }
    }

    /*
    method to delete a person
     */
    @Override
    public void deletar(Pessoa pessoa) {
        try {
            em.getTransaction().begin();
            em.remove(pessoa);
            em.getTransaction().commit();
        } catch (Throwable t) {
            t.printStackTrace();
            em.getTransaction().rollback();
        }
    }

    public void updatePessoa(Pessoa pessoa) {//um possivel editar

        try {
            em.getTransaction().begin();
            em.merge(pessoa);
            em.getTransaction().commit();
        } catch (Throwable t) {
            t.printStackTrace();
            em.getTransaction().rollback();
        }

    }

    ;


    /*
    method to list All a person
     */
    @Override
    public List<Pessoa> listarTodos() {
        return em.createQuery("SELECT p FROM Pessoa p order by p.nome").getResultList();
    }
    //retorna a lista da coluna especifica.

    public List<Pessoa> listarColunaEspecifica(String nomeColuna) {// Ainda não funciona

        return em.createQuery("SELECT :nomeColuna FROM Pessoa").setParameter(":nomeColuna", nomeColuna).getResultList();
    }
    //usado para procurar o login e a senha passado por parametro.

    public Pessoa validarLogin(String login, String senha) {
        try {
            return (Pessoa) em.createQuery("SELECT p FROM Pessoa p WHERE p.login = :login and p.senha = :senha").setParameter("login", login).setParameter("senha", senha).getSingleResult();
        } catch (NoResultException e) {
            e.getMessage();
            return null;
        } catch (NonUniqueResultException e) {
            e.getMessage();
            return null;
        }
    }

    /*
    method to search person
     */
    @Override
    public Pessoa procurarPessoa(int id) {
        return em.find(Pessoa.class, id);
    }
}
